package com.sophossystems.client.asmon.service.impl;

import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;

import com.sophossystems.client.asmon.dao.ClienteDao;
import com.sophossystems.client.asmon.dao.ClientePMoralesDao;
import com.sophossystems.client.asmon.dao.ClientePersonasFisicasDao;
import com.sophossystems.client.asmon.dao.DireccionDao;
import com.sophossystems.client.asmon.dao.DocumentosDao;
import com.sophossystems.client.asmon.dao.FacturaDao;
import com.sophossystems.client.asmon.dao.RecolectaDocDao;
import com.sophossystems.client.asmon.dao.RepresentanteDocDao;
import com.sophossystems.client.asmon.dao.RepresentanteLegalDao;
import com.sophossystems.client.asmon.dao.ServiciosDao;
import com.sophossystems.client.asmon.dto.ClienteDTO;
import com.sophossystems.client.asmon.dto.ClientePMoralesDTO;
import com.sophossystems.client.asmon.dto.ClientePersonasFisicasDTO;
import com.sophossystems.client.asmon.exceptions.BusinessException;
import com.sophossystems.client.asmon.exceptions.DaoException;
import com.sophossystems.client.asmon.service.SearchService;

public class SearchServiceImpl implements SearchService {
	private DireccionDao direccionDao;
	private ClientePMoralesDao personaMoralDao;
	private ClientePersonasFisicasDao personaFisicaDao;
	private ServiciosDao serviciosDao;
	private DocumentosDao documentosDao;
	private RecolectaDocDao recoleccionDao;
	private FacturaDao facturacionDao;
	private ClienteDao clienteDao;
	private RepresentanteDocDao representanteDocDao;
	private RepresentanteLegalDao representanteLegalDao;
	
	private static Logger log = Logger.getLogger(SearchServiceImpl.class);
	
	@Override
	public ClienteDTO buscarRfc(ClienteDTO cliente) throws BusinessException {
		// busca cliente por rfc para evitar duplicados
				ClienteDTO clienteRfc = new ClienteDTO();
				try {
					clienteRfc = (ClienteDTO) clienteDao.findByRfc(cliente.getRfc());
				} catch (DaoException e) {
					if (e.getMessage().contains("0"))
						clienteRfc = null;
					log.error("error al buscar RFC en tabla clientes, causa: " + e.getCause());
				}
		return clienteRfc;
	}
	
	public ClientePersonasFisicasDTO detalleFisica(ClienteDTO cliente) throws BusinessException {
		// busca detalle de persona fisica
				ClientePersonasFisicasDTO personaF = null;
				try {
					personaF = personaFisicaDao.findByIdClienteGeneral(cliente.getIdCliente());
				} catch (DaoException e) {
					if (e.getMessage().contains("0"))
						personaF = null;
					log.error("error al buscar detalle de persona fisica, causa: " + e.getCause());
				}
		return personaF;
	}
	
	
	public ClientePMoralesDTO detalleMoral(ClienteDTO cliente) throws BusinessException {
		// busca detalle persona moral
				ClientePMoralesDTO personaM= null;
				try {
					personaM = personaMoralDao.findByIdClienteGeneral(cliente.getIdCliente());
				} catch (DaoException e) {
					if (e.getMessage().contains("0"))
						personaM = null;
					log.error("error al buscar detalle personaMoral, causa: " + e.getCause());
				}
		return personaM;
	}
	
	public List<ClientePMoralesDTO> buscarPorPalabraMorales(String palabra) throws BusinessException{
		List<ClientePMoralesDTO> listaClientesMorales = null;
//		busca clientes que contengan "palabra" en su razon social
		try {
			listaClientesMorales = personaMoralDao.busquedaPorPalabra(palabra);
		} catch (Exception e) {
			log.error("error en SeachService, busquedaPorPalabra");
		}
		
//		settea contenido de Cliente en el listado encontrado de personas morales
		for(int i = 0; i<=listaClientesMorales.size(); i++){
			try {
				listaClientesMorales.get(i).setCliente(clienteDao.findByPrimaryKey(listaClientesMorales.get(i).
						getIdClienteGeneral()));
			} catch (Exception e) {
				log.error("falla al buscar y settear informacion de cliente en busqueda por palabra personas morales" +
						" causa: " + e.getCause());
			}
			
		}
		return listaClientesMorales;
	}
	
	public List<ClientePersonasFisicasDTO> buscarPorPalabraFisicas(String palabra) throws BusinessException{
		List<ClientePersonasFisicasDTO> listaClientesFisicas = null;
//		busca clientes que contengan "palabra" en aPaterno, aMaterno, nombres
		try {
			listaClientesFisicas = personaFisicaDao.busquedaPorPalabra(palabra);
		} catch (Exception e) {
			log.error("error en SeachService, busquedaPorPalabra");
		}
		
//		settea contenido de Cliente en el listado encontrado de personas fisicas
		for(int i = 0; i<=listaClientesFisicas.size(); i++){
			try {
				listaClientesFisicas.get(i).setClientedto(clienteDao.findByPrimaryKey(listaClientesFisicas.get(i).
						getIdClienteGeneral()));
			} catch (Exception e) {
				log.error("falla al buscar y settear informacion de cliente en busqueda por palabra personas fisicas" +
						" causa: " + e.getCause());
			}
			
		}
		
		return listaClientesFisicas;
	}
	
	public List<ClienteDTO> buscarPorContador(final int idContador) throws BusinessException{
		List<ClienteDTO> listaClientes = null;
		try {
			listaClientes = clienteDao.findWhereIdContadorAsigEquals(idContador);
		} catch (Exception e) {
			 log.error("error al buscar clientes por contador asognado, causa: " + e.getCause());
		}
		
		return listaClientes;
	}
	
	/**
	 * @return the direccionDao
	 */
	public DireccionDao getDireccionDao() {
		return direccionDao;
	}
	/**
	 * @param direccionDao the direccionDao to set
	 */
	public void setDireccionDao(DireccionDao direccionDao) {
		this.direccionDao = direccionDao;
	}
	/**
	 * @return the personaMoralDao
	 */
	public ClientePMoralesDao getPersonaMoralDao() {
		return personaMoralDao;
	}
	/**
	 * @param personaMoralDao the personaMoralDao to set
	 */
	public void setPersonaMoralDao(ClientePMoralesDao personaMoralDao) {
		this.personaMoralDao = personaMoralDao;
	}
	/**
	 * @return the personaFisicaDao
	 */
	public ClientePersonasFisicasDao getPersonaFisicaDao() {
		return personaFisicaDao;
	}
	/**
	 * @param personaFisicaDao the personaFisicaDao to set
	 */
	public void setPersonaFisicaDao(ClientePersonasFisicasDao personaFisicaDao) {
		this.personaFisicaDao = personaFisicaDao;
	}
	/**
	 * @return the serviciosDao
	 */
	public ServiciosDao getServiciosDao() {
		return serviciosDao;
	}
	/**
	 * @param serviciosDao the serviciosDao to set
	 */
	public void setServiciosDao(ServiciosDao serviciosDao) {
		this.serviciosDao = serviciosDao;
	}
	/**
	 * @return the documentosDao
	 */
	public DocumentosDao getDocumentosDao() {
		return documentosDao;
	}
	/**
	 * @param documentosDao the documentosDao to set
	 */
	public void setDocumentosDao(DocumentosDao documentosDao) {
		this.documentosDao = documentosDao;
	}
	/**
	 * @return the recoleccionDao
	 */
	public RecolectaDocDao getRecoleccionDao() {
		return recoleccionDao;
	}
	/**
	 * @param recoleccionDao the recoleccionDao to set
	 */
	public void setRecoleccionDao(RecolectaDocDao recoleccionDao) {
		this.recoleccionDao = recoleccionDao;
	}
	/**
	 * @return the facturacionDao
	 */
	public FacturaDao getFacturacionDao() {
		return facturacionDao;
	}
	/**
	 * @param facturacionDao the facturacionDao to set
	 */
	public void setFacturacionDao(FacturaDao facturacionDao) {
		this.facturacionDao = facturacionDao;
	}
	/**
	 * @return the clienteDao
	 */
	public ClienteDao getClienteDao() {
		return clienteDao;
	}
	/**
	 * @param clienteDao the clienteDao to set
	 */
	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}
	/**
	 * @return the representanteDocDao
	 */
	public RepresentanteDocDao getRepresentanteDocDao() {
		return representanteDocDao;
	}
	/**
	 * @param representanteDocDao the representanteDocDao to set
	 */
	public void setRepresentanteDocDao(RepresentanteDocDao representanteDocDao) {
		this.representanteDocDao = representanteDocDao;
	}
	/**
	 * @return the representanteLegalDao
	 */
	public RepresentanteLegalDao getRepresentanteLegalDao() {
		return representanteLegalDao;
	}
	/**
	 * @param representanteLegalDao the representanteLegalDao to set
	 */
	public void setRepresentanteLegalDao(RepresentanteLegalDao representanteLegalDao) {
		this.representanteLegalDao = representanteLegalDao;
	}

}
